package com.kawins.base;

import com.kawins.base.baseabs.BaseModel;
import tk.mybatis.mapper.entity.Example;

import java.util.List;

/**
 * @author rankai
 *         createTime 2017-03-2017/3/10 15:00
 */
public interface BaseService<T extends BaseModel> {

    /**
     * 根据主键字段进行查询，方法参数必须包含完整的主键属性，查询条件使用等号
     *
     * @param id 主键
     * @return 实体
     */
    T selectByPrimaryKey(Object id);

    /**
     * 根据实体中的属性进行查询，只能有一个返回值，有多个结果是抛出异常，查询条件使用等号
     *
     * @param object 实体
     * @return 满足条件实体
     */
    T selectOne(T object);

    /**
     * 根据实体中的属性值进行查询，查询条件使用等号
     *
     * @param object 实体
     * @return 实体列表
     */
    List<T> select(T object);

    /**
     * 查询全部结果，select(null)方法能达到同样的效果
     *
     * @return 实体列表
     */
    List<T> selectAll();

    /**
     * 根据实体中的属性查询总数，查询条件使用等号
     *
     * @param object 实体
     * @return 满足条件个数
     */
    int selectCount(T object);

    /**
     * 根据Example对象查询总数，查询条件使用等号
     *
     * @param example Example对象
     * @return 满足条件个数
     */
    int selectCountByExample(Example example);

    /**
     * 根据Example条件进行查询 这个查询支持通过Example类指定查询列，通过selectProperties方法指定查询列
     *
     * @param example Example对象
     * @return 实体信息list
     */
    List<T> selectByExample(Example example);

//    /**
//     * @param object
//     * @param rowBounds
//     * @return
//     */
//    List<T> selectByRowBounds(T object, RowBounds rowBounds);
//
//    /**
//     * @param example
//     * @param rowBounds
//     * @return
//     */
//    List<T> selectByExampleAndRowBounds(Example example, RowBounds rowBounds);

    /**
     * 根据实体属性作为条件进行删除，查询条件使用等号
     *
     * @param object 实体
     * @return 影响数据库行数
     */
    int delete(T object);

    /**
     * 根据example删除数据
     *
     * @param example Example对象
     * @return 影响数据库行数
     */
    int deleteByExample(Example example);

    /**
     * 根据主键字段进行删除，方法参数必须包含完整的主键属性
     *
     * @param id 主键
     * @return 影响数据库行数
     */
    int deleteByPrimaryKey(Object id);

    /**
     * 保存一个实体，null的属性也会保存，不会使用数据库默认值
     *
     * @param object 实体
     * @return 影响数据库行数
     */
    int insert(T object);

    /**
     * 批量插入数据
     *
     * @param objects 对象集合
     * @return 影响数据库行数
     */
//    int insertList(List<T> objects);

    /**
     * 保存一个实体，null的属性不会保存，会使用数据库默认值
     *
     * @param object 实体
     * @return 影响数据库行数
     */
    int insertSelective(T object);

    /**
     * 根据主键更新实体全部字段，null值会被更新
     *
     * @param object 实体
     * @return 影响数据库行数
     */
//    int insertUseGeneratedKeys(T object);

    /**
     * 根据example更新实体,null值会被更新
     *
     * @param object  实体
     * @param example Example对象
     * @return 影响数据库行数
     */
    int updateByExample(T object, Example example);

    /**
     * 根据example更新属性不为null的值
     *
     * @param object  实体
     * @param example Example对象
     * @return 影响数据库行数
     */
    int updateByExampleSelective(T object, Example example);

    /**
     * 根据主键更新实体全部字段，null值会被更新
     *
     * @param object 实体
     * @return 影响数据库行数
     */
    int updateByPrimaryKey(T object);

    /**
     * 根据主键更新属性不为null的值
     *
     * @param object 实体
     * @return 影响数据库行数
     */
    int updateByPrimaryKeySelective(T object);

    /**
     * 根据实体属性和RowBounds进行分页查询,以page作为开始参数
     *
     * @param object 实体
     * @param page   页数
     * @param size   个数
     * @return 分页实体个数
     */
    List<T> pageList(T object, Integer page, Integer size);

    /**
     * 据实体属性和RowBounds进行分页查询,以page作为开始参数(基于example)
     *
     * @param example Examples示例
     * @param page    实体
     * @param size    个数
     * @return 分页实体个数
     */
    List<T> pageList(Example example, Integer page, Integer size);

}
